package com.itheima.zuoye.zuoye2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
    /*
    ：定义一个标准的JavaBean，名叫Person，包含属性name、age。
  1.使用反射的方式创建一个实例、调用构造函数初始化name、age，
   2.使用反射方式调用setName方法对名称进行设置，不使用setAge方法，直接使用反射方式对age赋值。
   3.使用反射的方式设置age/name的Field
- 获取Person的字节码Class
- 通过Class获取有参构造方法
- 调用构造方法，创建Person对象
- 通过Class获取setName方法对象
- 执行setName方法对象
- 通过Class获取age的Field对象
- 设置属性
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class<?> aClass = Class.forName("com.itheima.zuoye.zuoye2.Person");
        Constructor<?> constructor = aClass.getDeclaredConstructor();
        Object as = constructor.newInstance();


        System.out.println("-----------------");
        constructor.setAccessible(true);
        Method setName = aClass.getDeclaredMethod("setName", String.class);
        setName.invoke(as, "张三");
        Field age = aClass.getDeclaredField("age");
        age.setAccessible(true);
        age.set(as, 18);
        System.out.println(as);


    }
}
